Play入门教程3 Router路由与Controller,Action,地址变量与QueryString



下面介绍一下Scala Play框架中的Action/ Controller 以及 Http routing

Action

Play应用程序收到的大多数请求都是由 Action 处理的。

Action 是一种处理带参请求,并将结果发送到客户端的Java方法。

  def echo = Action { request =>
    Ok("Got request [" + request + "]")
  }

Action 将返回play.api.mvc.Result值,表示要发送给客户端的HTTP响应。 在此示例中,Ok构造了一个200 OK响应,响应内容为纯文本。

通常将请求参数标记为 implicit(隐式)很有用,以便其他需要它的API可以省略传递request参数:

  def echo = Action { implicit request =>
    //Ok("Got request [" + request + "]")
    echoMethod("Got request")
  }

  def echoMethod(p: String)(implicit request: Request[_]) = {
    val hasBody = request.hasBody
    Ok(p + " hasBody " + hasBody + " echoMethod() " + request)
  }

Controller

控制器 Controller 是 Action 生成器。可以将功能相近的ACTION定义到一个 Controller 中,在 app/controllers 目录下新一个 ApiController.scala 的文件,内容如下:

package controllers

import javax.inject._
import play.api.mvc._

@Singleton
class ApiController @Inject() (cc: ControllerComponents) extends AbstractController(cc) {
  def echo = Action { implicit request =>
    echoMethod("Got request")
  }

  def echoMethod(p: String)(implicit request: Request[_]) = {
    val hasBody = request.hasBody
    Ok(p + " hasBody " + hasBody + " echoMethod() " + request)
  }
}

Controller 通过 @Inject 声明为依赖注入。

HTTP routing 路由

conf/routes 是路由器使用的配置文件。 该文件列出了所有路由。 每个路由都包含一个HTTP方法和URI模式,并对应一个 Action。

比如,我们在DEMO中添加一个 echo 方法的路由。

GET     /                   controllers.HomeController.index()
GET     /explore       controllers.HomeController.explore()
GET     /tutorial        controllers.HomeController.tutorial()
GET     /api/echo     controllers.ApiController.echo()

访问 http://localhost:9000/echo 的结果如下

play_scala_echo.png

router 地址变量参数

URI模式定义了路由的请求路径。 请求路径的一部分可以是动态的,下面的router定义了 name 和 age 两个参数:

GET     /api/user/:name/:age    controllers.ApiController.user(name, age:Int)

Action中接收变量:

  def user(name: String, age: Int) = Action { implicit request =>
    Ok("name:" + name + " age:" + age.toString())
  }

地址变量由 "/" 来分隔,如果变量中含有"/"等特殊字符,可使用 "*" 定义:

GET     /api/home/*address      controllers.ApiController.home(address: String)

router querystring参数

GET     /api/userage            controllers.ApiController.user(name, age:Int)

通过 querystring 同样可以访问到 user 的 Action 方法

http://localhost:9000/api/userage?name=kris&age=28

router 正则变量

您还可以使用$id语法为定义自己的正则表达式,比如:

GET     /api/view/$id<article[0-9]+>    controllers.ApiController.view(id)

匹配结果:

http://localhost:9000/api/view/article103  通过
http://localhost:9000/api/view/article-103  不通过

router 变量默认值

可设置变量默认值:

GET     /api/userage            controllers.ApiController.user(name ?= "kris", age:Int)

上一篇: 2 IntelliJ单步断点调试Scala Play Web项目 下一篇: 4 自定义Header,读写Cookie